﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using Manager.App_Code;
using System.Linq;
using Manager.Common;
using Manager.ViewModels;
using System.Data.Linq;

namespace Manager.FormAdd_Edit
{
    public partial class frm_RegistryRoom : DevExpress.XtraEditors.XtraForm
    {
        NewPearl_HotelDataContext db = new NewPearl_HotelDataContext();
        Dictionary<string, DataRow> dic = new Dictionary<string, DataRow>();
        List<DatPhongViewModel> lstDatPhong = new List<DatPhongViewModel>();
        PhieuDatPhong phieuDatPhong = null;

        public frm_RegistryRoom(PhieuDatPhong _phieuDatPhong)
        {
            InitializeComponent();
            phieuDatPhong = _phieuDatPhong;
        }
        
        private void frm_RegistryRoom_Load(object sender, EventArgs e)
        {            
            try
            {
                gridControl1.DataSource = db.View_LoaiPhongs.ToList();
                var lstTienTe = db.TienTes.ToList();
                cboxTienTe.DataSource = lstTienTe;
                cboxTienTe.DisplayMember = "MaDonVi";
                cboxTienTe.ValueMember = "TenDonVi";

                var lstQuocGia = db.QuocGias.ToList();
                cmbQuocGia.DataSource = lstQuocGia;
                cmbQuocGia.DisplayMember = "TenQuocGia";
                cmbQuocGia.ValueMember = "MaQuocGia";

                lstDatPhong = new List<DatPhongViewModel>();
                cmbLoaiID.SelectedIndex = 0;
                if (phieuDatPhong == null)
                {
                    dateNgayLapPhieu.Text = DateTime.Now.ToShortDateString();
                    txtMaPD.Text = DateTime.Now.ToString("ddMMyyyyhhmmss");
                    var tienTe = lstTienTe.Where(i => i.MaDonVi == "VND").ToList();
                    if (tienTe.Count > 0)
                        cboxTienTe.SelectedItem = tienTe.First();
                }
                else
                {
                    dateNgayLapPhieu.Text = phieuDatPhong.Ngaylap.Value.ToShortDateString();
                    txtMaPD.Text = phieuDatPhong.MaPhieuDat;
                    txtNguoiDat.Text = phieuDatPhong.NguoiDat;
                    txtDiaChi.Text = phieuDatPhong.Diachi;
                    txtDienThoai.Text = phieuDatPhong.LienHe;
                    txtTenKhach.Text = phieuDatPhong.TenKhach;
                    txtMaQuocGia.Text = phieuDatPhong.QuocTich;
                    txtTenNhomKhach.Text = phieuDatPhong.NhomKhachDatPhong == null ? "" : phieuDatPhong.NhomKhachDatPhong.TenNhomKhach;
                    cmbQuocGia.SelectedItem = phieuDatPhong.QuocGia;

                    if (!string.IsNullOrEmpty(phieuDatPhong.CMND))
                    {
                        cmbLoaiID.SelectedIndex = 0;
                        txtID.Text = phieuDatPhong.CMND;
                    }
                    else if (!string.IsNullOrEmpty(phieuDatPhong.Passport))
                    {
                        cmbLoaiID.SelectedIndex = 1;
                        txtID.Text = phieuDatPhong.Passport;
                    }
                    txtSoTaiKhoan.Text = phieuDatPhong.SoTaiKhoan;
                    dateHanTaiKhoan.Text = phieuDatPhong.HanTaiKhoan == null ? "" : phieuDatPhong.HanTaiKhoan.Value.ToShortDateString();

                    txtTienCoc.Text = phieuDatPhong.TienCoc.Value.ToString();
                    var tienTe = lstTienTe.Where(i => i.MaDonVi == phieuDatPhong.DonViTienTe).ToList();
                    if (tienTe.Count > 0)
                        cboxTienTe.SelectedItem = tienTe.First();
                    dateNgayDen.Text = phieuDatPhong.NgayDen.Value.ToShortDateString();
                    dateNgayDi.Text = phieuDatPhong.NgayDi.Value.ToShortDateString();

                    var datPhong = new DatPhongViewModel();
                    var chiTietPhieuDat = phieuDatPhong.ChiTietPhieuDatPhongs.ToList();
                    foreach (var ctpd in chiTietPhieuDat)
                    {
                        datPhong.TenLoaiPhong = ctpd.LoaiPhong.TenLoaiPhong;
                        datPhong.MaLoaiPhong = ctpd.LoaiPhong.MaLoaiPhong;
                        datPhong.Gia = ctpd.LoaiPhong.GiaPhong.Value;
                        datPhong.GhiChu = ctpd.LoaiPhong.GhiChu;
                        datPhong.SoLuong = ctpd.ChiTiet_ChiTietPhieuDatPhongs.ToList().Count.ToString();
                        datPhong.SoNguoiMotPhong = ctpd.LoaiPhong.SoNguoi.ToString();
                        lstDatPhong.Add(datPhong);
                    }
                    gridControl2.DataSource = lstDatPhong;
                }
            }
            catch (Exception ex)
            {
                Log.WriteLog("frm_RegistryRoom:frm_RegistryRoom_Load" + ex.Message + "\n" + ex.StackTrace);
                MessageBox.Show("Có lỗi xảy ra!!!");
            }
        }               
        
        private void btnLuuVaThoat_Click(object sender, EventArgs e)
        {
            btnLuu_Click(sender, e);
            this.Close();
        }

        private void btnLuu_Click(object sender, EventArgs e)
        {
            try
            {
                #region validate
                if (dateNgayDi.Text == "" || dateNgayDen.Text == "")
                {
                    MessageBox.Show("Vui lòng chọn ngày đi, ngày đến!", "Thông báo");
                    return;
                }

                else if ((DateTime.Parse(dateNgayDi.Text)).Day - (DateTime.Parse(dateNgayDen.Text)).Day < 0)
                {
                    MessageBox.Show("Ngày đi phải lớn hơn hoặc bằng Ngày đến!", "Thông báo");
                    dateNgayDi.Focus();
                    return;
                }

                else if (txtNguoiDat.Text == "" || txtTenKhach.Text == "")
                {
                    MessageBox.Show("Vui lòng nhập tên người đặt và khách hàng!");
                    if (txtNguoiDat.Text != "")
                        txtTenKhach.Focus();
                    else
                        txtNguoiDat.Focus();
                    return;
                }
                else if (lstDatPhong == null || lstDatPhong.Count <= 0)
                {
                    MessageBox.Show("Bạn chưa chọn phòng đặt!!!");
                    return;
                }
                #endregion
                #region tao moi
                if (phieuDatPhong == null)
                {
                    var phieudat = new PhieuDatPhong();
                    phieudat.MaPhieuDat = txtMaPD.Text;
                    phieudat.NguoiDat = txtNguoiDat.Text;
                    phieudat.Diachi = txtDiaChi.Text;
                    phieudat.LienHe = txtDienThoai.Text;
                    phieudat.DienThoaiNguoiDat = "";
                    phieudat.Ngaylap = DateTime.Now;
                    phieudat.SoFax = "";
                    phieudat.TenKhach = txtTenKhach.Text;
                    phieudat.DienThoaiKhach = "";
                    phieudat.NgayDen = dateNgayDen.DateTime;
                    phieudat.NgayDi = dateNgayDi.DateTime;
                    phieudat.TienCoc = CommonFunction.ParseDouble(txtTienCoc.Text);
                    phieudat.QuocTich = cmbQuocGia.SelectedValue.ToString();
                    if (txtTenNhomKhach.Text != "")
                    {
                        NhomKhachDatPhong nhomKhach = new NhomKhachDatPhong();
                        nhomKhach.TenNhomKhach = txtTenNhomKhach.Text;
                        nhomKhach.NgayDen = dateNgayDen.DateTime;
                        nhomKhach.NgayDi = dateNgayDi.DateTime;
                        phieudat.NhomKhachDatPhong = nhomKhach;
                    }
                    var tiente = (TienTe)cboxTienTe.SelectedItem;
                    phieudat.DonViTienTe = tiente.MaDonVi;
                    if (cmbLoaiID.SelectedIndex == 0)
                    {
                        phieudat.CMND = txtID.Text;
                        phieudat.Passport = "";
                    }
                    else
                    {
                        phieudat.Passport = txtID.Text;
                        phieudat.CMND = "";
                    }
                    phieudat.SoTaiKhoan = txtSoTaiKhoan.Text;
                    phieudat.HanTaiKhoan = dateHanTaiKhoan.DateTime;

                    db.PhieuDatPhongs.InsertOnSubmit(phieudat);                    
                    for (int i = 0; i <= lstDatPhong.Count - 1; i++)
                    {
                        var chitetphieudat = new ChiTietPhieuDatPhong();
                        //chitetphieudat.MaPhieuDat = phieudat.MaPhieuDat;
                        chitetphieudat.MaLoaiPhong = lstDatPhong[i].MaLoaiPhong;
                        chitetphieudat.GiaPhong = lstDatPhong[i].Gia;
                        chitetphieudat.MaTienTe = lstDatPhong[i].MaTienTe;
                        chitetphieudat.SoLuong = CommonFunction.ParseInt(lstDatPhong[i].SoLuong);

                        phieudat.ChiTietPhieuDatPhongs.Add(chitetphieudat);
                        for (int j = 0; j <= CommonFunction.ParseInt(lstDatPhong[i].SoLuong) - 1; j++)
                        {
                            var chitiet_chitietphieudat = new ChiTiet_ChiTietPhieuDatPhong();
                            //chitiet_chitietphieudat.ChiTietPhieuDatPhongId = db.ChiTietPhieuDatPhongs.Max(t => t.ChiTietPhieuDatPhongId);
                            chitiet_chitietphieudat.MaPhong = "";
                            chitiet_chitietphieudat.TrangThai = false;

                            chitetphieudat.ChiTiet_ChiTietPhieuDatPhongs.Add(chitiet_chitietphieudat);
                        }
                    }
                    db.SubmitChanges();
                }
                #endregion
                #region update
                else
                {
                    var temp = db.PhieuDatPhongs.Single(i => i.MaPhieuDat == phieuDatPhong.MaPhieuDat);
                    temp.MaPhieuDat = txtMaPD.Text;
                    temp.NguoiDat = txtNguoiDat.Text;
                    temp.Diachi = txtDiaChi.Text;
                    temp.LienHe = txtDienThoai.Text;
                    temp.Ngaylap = DateTime.Now;
                    temp.TenKhach = txtTenKhach.Text;
                    temp.DienThoaiKhach = "";
                    temp.NgayDen = dateNgayDen.DateTime;
                    temp.NgayDi = dateNgayDi.DateTime;
                    temp.TienCoc = CommonFunction.ParseDouble(txtTienCoc.Text);
                    var tiente = (TienTe)cboxTienTe.SelectedItem;
                    temp.QuocTich = cmbQuocGia.SelectedValue.ToString();
                    temp.DonViTienTe = tiente.MaDonVi;
                    if (txtTenNhomKhach.Text != "")
                    {
                        if (temp.NhomKhachDatPhong != null)
                        {
                            var nk = temp.NhomKhachDatPhong;
                            temp.NhomKhachDatPhong = null;
                            db.NhomKhachDatPhongs.DeleteOnSubmit(nk);
                        }
                        NhomKhachDatPhong nhomKhach = new NhomKhachDatPhong();
                        nhomKhach.TenNhomKhach = txtTenNhomKhach.Text;
                        nhomKhach.NgayDen = dateNgayDen.DateTime;
                        nhomKhach.NgayDi = dateNgayDi.DateTime;
                        temp.NhomKhachDatPhong = nhomKhach;
                    }
                    if (cmbLoaiID.SelectedIndex == 0)
                    {
                        temp.CMND = txtID.Text;
                        temp.Passport = "";
                    }
                    else
                    {
                        temp.Passport = txtID.Text;
                        temp.CMND = "";
                    }
                    temp.SoTaiKhoan = txtSoTaiKhoan.Text;
                    temp.HanTaiKhoan = dateHanTaiKhoan.DateTime;

                    var lstChiTietPhieuDat = temp.ChiTietPhieuDatPhongs.ToList();
                    foreach (var ctpd in lstChiTietPhieuDat)
                    {
                        var lstChiTiet_ChiTietPhieuDat = ctpd.ChiTiet_ChiTietPhieuDatPhongs.ToList();
                        db.ChiTiet_ChiTietPhieuDatPhongs.DeleteAllOnSubmit(lstChiTiet_ChiTietPhieuDat);//xoa toan bo chitiet_chitietphieudatphong
                    }
                    db.ChiTietPhieuDatPhongs.DeleteAllOnSubmit(lstChiTietPhieuDat);// xoa toan bo chitietphieudatphong
                    for (int i = 0; i <= lstDatPhong.Count - 1; i++)
                    {
                        var chitetphieudat = new ChiTietPhieuDatPhong();
                        chitetphieudat.MaLoaiPhong = lstDatPhong[i].MaLoaiPhong;
                        chitetphieudat.GiaPhong = lstDatPhong[i].Gia;
                        chitetphieudat.SoLuong = CommonFunction.ParseInt(lstDatPhong[i].SoLuong);

                        temp.ChiTietPhieuDatPhongs.Add(chitetphieudat);
                        for (int j = 0; j <= CommonFunction.ParseInt(lstDatPhong[i].SoLuong) - 1; j++)
                        {
                            var chitiet_chitietphieudat = new ChiTiet_ChiTietPhieuDatPhong();
                            chitiet_chitietphieudat.MaPhong = "";
                            chitiet_chitietphieudat.TrangThai = false;

                            chitetphieudat.ChiTiet_ChiTietPhieuDatPhongs.Add(chitiet_chitietphieudat);                            
                        }
                    }
                    db.SubmitChanges();
                }
                #endregion
                MessageBox.Show("Đã lưu dữ liệu thành công.");
            }
            catch (Exception ex)
            {
                Log.WriteLog("frm_RegistryRoom:btnLuu_Click" + ex.Message + "\n" + ex.StackTrace);
                MessageBox.Show("Có lỗi xảy ra!!!");
            }
        }

        private void butThemMoi_Click(object sender, EventArgs e)
        {
            dateNgayLapPhieu.Text = DateTime.Now.ToShortDateString();
            txtMaPD.Text = DateTime.Now.ToString("ddMMyyyyhhmmss");
            txtNguoiDat.Text = "";
            txtDiaChi.Text = "";
            txtDienThoai.Text = "";
            txtTenKhach.Text = "";
            dateNgayDen.Text = "";
            dateNgayDi.Text = "";
            txtTienCoc.Text = "";
            txtID.Text = "";
            dateHanTaiKhoan.Text = "";
            dateNgayDen.Text = "";
            dateNgayDi.Text = "";
            txtSoTaiKhoan.Text = "";
            lstDatPhong.Clear();
            gridControl2.DataSource = null;
            phieuDatPhong = null;
        }   

        private void btnThoat_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void txtDienThoai_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
                MessageBox.Show("Chỉ được nhập số!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            int index = gridView2.FocusedRowHandle;
            string maLoaiPhong = gridView2.GetRowCellValue(index, MaLoaiPhong2).ToString();
            var temp = lstDatPhong.Where(i => i.MaLoaiPhong == maLoaiPhong).ToList();
            if (temp.Count > 0)
                lstDatPhong.Remove(temp.First());
            gridControl2.DataSource = null;
            gridControl2.DataSource = lstDatPhong;
        }

        private void repositoryItemCheckEdit1_CheckStateChanged(object sender, EventArgs e)
        {
            CheckEdit ck = sender as CheckEdit;
            var loaiPhongView = gridView1.GetFocusedRow() as View_LoaiPhong;
            var datPhong = new DatPhongViewModel();
            datPhong.TenLoaiPhong = loaiPhongView.TenLoaiPhong;
            datPhong.Gia = loaiPhongView.GiaPhong.Value;
            datPhong.SoLuong = "1";
            datPhong.SoNguoiMotPhong = loaiPhongView.SoNguoi == null ? "" : loaiPhongView.SoNguoi.Value.ToString();
            datPhong.MaLoaiPhong = loaiPhongView.MaLoaiPhong;
            datPhong.MaTienTe = loaiPhongView.DonViTienTe;
            if (ck != null)
            {
                if (ck.Checked)
                {
                    var tempt = lstDatPhong.Where(i => i.MaLoaiPhong == datPhong.MaLoaiPhong).ToList();
                    if (tempt.Count == 0)
                        lstDatPhong.Add(datPhong);
                }
                else
                {
                    var tempt = lstDatPhong.Where(i => i.MaLoaiPhong == datPhong.MaLoaiPhong).ToList();
                    if (tempt.Count > 0)
                        lstDatPhong.Remove(tempt.First());
                }
                gridControl2.DataSource = null;
                gridControl2.DataSource = lstDatPhong;
            }
        }

        private void gridView2_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
        {
            //if (e.Column.Name != "SoLuong1")
            //    return;
            //var value = gridView2.GetRowCellValue(e.RowHandle, e.Column).ToString();
            //var maphong = gridView2.GetRowCellValue(e.RowHandle, MaLoaiPhong2).ToString();
            //var temp = lstDatPhong.Where(i => i.MaLoaiPhong == maphong).ToList();
            //if (temp.Count > 0)
            //    temp.First().SoLuong = value;
        }

        private void btnTimKiem_Click(object sender, EventArgs e)
        {
            frm_SearchCustomer searchCustomer = new frm_SearchCustomer();
            searchCustomer.FormClosed += new FormClosedEventHandler(searchCustomer_FormClosed);
            searchCustomer.ShowDialog();            
        }

        void searchCustomer_FormClosed(object sender, FormClosedEventArgs e)
        {
            var frm = sender as frm_SearchCustomer;
            if (frm.khachHang != null)
            {
                var kh = frm.khachHang;
                txtNguoiDat.Text = kh.TenKH;
                txtDiaChi.Text = kh.DiaChi;
                txtDienThoai.Text = kh.DienThoai;
                txtTenKhach.Text = kh.TenKH;
                txtSoTaiKhoan.Text = kh.SoTaiKhoan;
                dateHanTaiKhoan.Text = kh.HanTaiKHoan == null ? "" : kh.HanTaiKHoan.Value.ToShortDateString();
            }
        }

        private void txtID_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (cmbLoaiID.SelectedIndex == 0)
            {
                if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
                {
                    e.Handled = true;
                }
            }
        }        

        private void txtMaQuocGia_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                var quocGia = db.QuocGias.SingleOrDefault(t => t.MaQuocGia == (txtMaQuocGia.Text).ToUpper());
                if (quocGia != null)
                    cmbQuocGia.SelectedItem = quocGia;
            }
        }

        private void txtMaQuocGia_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.KeyChar = char.ToUpper(e.KeyChar);
        }        
        
    }
}